package com.example.controller;

import com.example.entity.RestBean;
import com.example.service.ImageService;
import io.minio.errors.ErrorResponseException;
import jakarta.annotation.Resource;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

// 使用@Slf4j注解为这个类提供日志功能，这意味着可以在类中直接使用log对象进行日志记录，如log.error(), log.info()等。
@Slf4j
// @RestController注解表明这个类是一个控制器，其中的方法返回值会自动作为HTTP响应体返回。
@RestController
public class ObjectController {

    // 通过@Resource注解注入ImageService实例，这样ObjectController就可以使用ImageService提供的方法来处理业务逻辑。
    @Resource
    private ImageService service;

    // @GetMapping注解定义了一个处理GET请求的方法。这里的"/images/**"表示匹配所有以"/images/"开头的请求路径。
    @GetMapping("/images/**")
    public void imageFetch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 设置响应的内容类型为image/jpg，告诉浏览器这是一张JPEG格式的图片。
        response.setHeader("Content-Type", "image/jpg");
        // 调用fetchImage方法处理图片获取的逻辑。
        this.fetchImage(request, response);
    }

    // 定义一个私有方法fetchImage，用于实际处理图片获取的逻辑。
    private void fetchImage(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 从请求的路径中截取出图片的路径信息。
        String imagePath = request.getServletPath().substring(7);
        // 获取响应的输出流，用于向客户端发送数据。
        ServletOutputStream stream = response.getOutputStream();
        // 如果图片路径的长度小于或等于13，认为是无效请求，设置响应状态码为404并返回错误信息。
        if(imagePath.length() <= 13) {
            response.setStatus(404);
            stream.println(RestBean.failure(404, "Not found").toString());
        } else {
            try {
                // 调用service的fetchImageFromMinio方法，尝试从Minio中获取图片并写入响应的输出流。
                service.fetchImageFromMinio(stream, imagePath);
                // 设置缓存控制头，让浏览器缓存这张图片30天（2592000秒）。
                response.setHeader("Cache-Control", "max-age=2592000");
            } catch (ErrorResponseException e) {
                // 如果从Minio获取图片时出现异常，根据异常的类型设置响应状态并返回错误信息。
                if(e.response().code() == 404) {
                    response.setStatus(404);
                    stream.println(RestBean.failure(404, "Not found").toString());
                } else {
                    // 如果是其他类型的错误，记录错误日志。
                    log.error("从Minio获取图片出现异常: "+e.getMessage(), e);
                }
            }
        }
    }
}
